# -*- coding: utf-8 -*- 

"""Génère le code nécéssaire aux opérateurs de RObjet.java (code qui
est un peu rébarbatif)"""

operateursBinaires = [
	("index", "[]"),
	("plus", "+"),
	("moins", "-"),
	("etoile", "*"),
	("slash", "/"),
	"modulo",

	"egal",
	"inegal",
	"inf",
	"sup",
	"infegal",
	"supegal",
	
	"et",
	"ou",
	"ouex",
]

operateursUnaires = [
	
]

modeleOperateurBinaire = """
/**
 * Opérateur binaire %(signe)s<br>
 *
 * Cette méthode doit être appelée uniquement si <code>this</code> est
 * une classe intégrée.
 * Sinon, on ne pourra pas surcharger l’opérateur.
 *
 * @param autre L’opérande de droite.
 * @return Le résultat de l’opération ou <code>null</code>, si l’opération
 * n’est pas définie.
 */
protected RObjet operateur%(Nom)sBase(RObjet autre) {
	return null;
}

/**
 * Opérateur binaire %(signe)s<br>
 *
 * @param autre L’opérande de droite.
 * @return Le résultat de l’opération
 */
public final RObjet operateur%(Nom)s(RObjet autre) {
	if (classe.estIntegree) {
		RObjet r = operateur%(Nom)sBase(autre);
		if (r != null)
			return r;
		throw opBinIndefini("%(signe)s", autre);
	}

	RObjet impl = classe.getMembre("operateur%(Nom)s");
	if (impl == null)
		throw opBinIndefini("%(signe)s", autre);
	return impl.appeler(new RObjet[] {autre});
}

"""


modeleOperateurUnaire = """
/**
 * Opérateur unaire %(signe)s<br>
 *
 * Cette méthode doit être appelée uniquement si <code>this</code> est
 * une classe intégrée.
 * Sinon, on ne pourra pas surcharger l’opérateur.
 *
 * @return Le résultat de l’opération ou <code>null</code>, si l’opération
 * n’est pas définie.
 */
protected RObjet operateurUnaire%(Nom)sBase() {
	return null;
}

/**
 * Opérateur unaire %(signe)s<br>
 *
 * @return Le résultat de l’opération
 */
public final RObjet operateurUnaire%(Nom)s() {
	if (classe.estIntegree) {
		RObjet r = operateurUnaire%(Nom)sBase();
		if (r != null)
			return r;
		throw opIndefini("%(signe)s");
	}

	RObjet impl = classe.getMembre("operateurUnaire%(Nom)s");
	if (impl == null)
		throw opIndefini("%(signe)s");
	return impl.appeler(new RObjet[] {});
}

"""

def generer():

	slashes = "//////////"
	message = " du code généré par genererOperateurs.py"

	print("\n" + slashes + " Début" + message + " " + slashes)
	
	for operateur in operateursBinaires:

		if type(operateur) == tuple:
			nom, signe = operateur
		else:
			nom = signe = operateur
		
		variables = {
			"Nom" : nom.title(),
			"nom" : nom,
			"signe" : signe,
		}
		print(modeleOperateurBinaire % variables)

	print(slashes + " Fin" + message + " " + slashes + "\n")

generer()

